package link;

import beans.ListNode;

/**
 * @author pengfei.hpf
 * @date 2020/3/9
 * @verdion 1.0.0
 * 19. 删除链表的倒数第N个节点
 * 给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。
 *
 * 示例：
 *
 * 给定一个链表: 1->2->3->4->5, 和 n = 2.
 *
 * 当删除了倒数第二个节点后，链表变为 1->2->3->5.
 * 说明：
 *
 * 给定的 n 保证是有效的。
 *
 * 进阶：
 *
 * 你能尝试使用一趟扫描实现吗？
 *
 * 通过次数132,006提交次数348,730
 */
public class RemoveNthFromEnd {

    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null){
            return head;
        }
        //TODO: 注意边缘条件, 删除头部节点怎么弄!!!
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode fast = dummy.next;
        for(int i = 0; i < n && fast != null; i ++){
            fast = fast.next;
        }
        ListNode slow = dummy;
        while(fast != null){
            slow = slow.next;
            fast = fast.next;
        }
        if(slow.next != null){
            slow.next = slow.next.next;
        }
        return dummy.next;
    }
}
